using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Util;
using MakeIT.Framework.Data;
using MakeIT.MakeIT.Laundy.Agromotor.Site.Entidades;

namespace MakeIT.MakeIT.Laundy.Agromotor.Site.Negocios
{
	public partial class AgromotorsiteDAO : DAO
	{

		public static UsuarioVO getUsuario(int? idUsuario, string nome)
		{
			UsuarioVO usuarioVO = null;
			List<UsuarioVO> listUsuarioVOs = getUsuarios(idUsuario, nome, null, null, null);
			if (listUsuarioVOs != null && listUsuarioVOs.Count > 0)
			{
				usuarioVO = listUsuarioVOs[0];
			}
			return usuarioVO;
		}

		public static UsuarioVO getUsuario(int? idUsuario)
		{
			return getUsuario(idUsuario, null);
		}

		public static List<UsuarioVO> getUsuarios()
		{
			return getUsuarios(null, null, null, null, null);
		}

		public static List<UsuarioVO> getUsuarios(int? idUsuario)
		{
			return getUsuarios(idUsuario, null, null, null, null);
		}

		public static List<UsuarioVO> getUsuarios(int? idUsuario, string nome, string email, string user, bool? ativo)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT usu.idUsuario as usu_idUsuario, usu.nome as usu_nome, usu.email as usu_email, usu.user as usu_user, usu.pass as usu_pass, usu.ativo as usu_ativo, usu.fone1 as usu_fone1, usu.fone2 as usu_fone2, usu.fone3 as usu_fone3, usu.Cadastro as usu_Cadastro, usu.CadastradoPor as usu_CadastradoPor, usu.Edicao as usu_Edicao, usu.EditadoPor as usu_EditadoPor  ");
			query.AppendLine("FROM usuario as usu ");
			if (idUsuario != null)
			{
				query.AppendLine(where + "usu.idUsuario=@idUsuario ");
				where = "AND ";
			}
			if (nome != null)
			{
				query.AppendLine(where + "usu.nome LIKE @nome ");
				where = "AND ";
			}
			if (email != null)
			{
				query.AppendLine(where + "usu.email=@email ");
				where = "AND ";
			}
			if (user != null)
			{
				query.AppendLine(where + "usu.user=@user ");
				where = "AND ";
			}
			if (ativo != null)
			{
				query.AppendLine(where + "usu.ativo=@ativo ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY usu.nome ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idUsuario!= null) cmd.Parameters.Add(getParameter(cmd, "@idUsuario", idUsuario));
			if (nome!= null) cmd.Parameters.Add(getParameter(cmd, "@nome", "%"+nome+"%"));
			if (email!= null) cmd.Parameters.Add(getParameter(cmd, "@email", email));
			if (user!= null) cmd.Parameters.Add(getParameter(cmd, "@user", user));
			if (ativo!= null) cmd.Parameters.Add(getParameter(cmd, "@ativo", ativo.Value?"S":"N"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<UsuarioVO> listUsuario = new List<UsuarioVO>();

				while (reader.Read())
				{
					UsuarioVO usuarioVO = UsuarioVO.CreateVO();
					usuarioVO.idUsuario = reader.GetInt32(reader.GetOrdinal("usu_idUsuario"));
					usuarioVO.nome = reader.GetString(reader.GetOrdinal("usu_nome"));
					if (!reader.IsDBNull(reader.GetOrdinal("usu_email")))
						usuarioVO.email = reader.GetString(reader.GetOrdinal("usu_email"));
					usuarioVO.user = reader.GetString(reader.GetOrdinal("usu_user"));
					if (!reader.IsDBNull(reader.GetOrdinal("usu_pass")))
						usuarioVO.pass = reader.GetString(reader.GetOrdinal("usu_pass"));
					usuarioVO.ativo = reader.GetString(reader.GetOrdinal("usu_ativo")).Equals("S");
					if (!reader.IsDBNull(reader.GetOrdinal("usu_fone1")))
						usuarioVO.fone1 = reader.GetString(reader.GetOrdinal("usu_fone1"));
					if (!reader.IsDBNull(reader.GetOrdinal("usu_fone2")))
						usuarioVO.fone2 = reader.GetString(reader.GetOrdinal("usu_fone2"));
					if (!reader.IsDBNull(reader.GetOrdinal("usu_fone3")))
						usuarioVO.fone3 = reader.GetString(reader.GetOrdinal("usu_fone3"));
					usuarioVO.cadastro = reader.GetDateTime(reader.GetOrdinal("usu_Cadastro"));
					usuarioVO.cadastradoPor = reader.GetString(reader.GetOrdinal("usu_CadastradoPor"));
					usuarioVO.edicao = reader.GetDateTime(reader.GetOrdinal("usu_Edicao"));
					usuarioVO.editadoPor = reader.GetString(reader.GetOrdinal("usu_EditadoPor"));

					listUsuario.Add(usuarioVO);
				}
				reader.Close();

                if (listUsuario != null && listUsuario.Count > 0)
                {
                    foreach (UsuarioVO usuarioVO in listUsuario)
                        if (usuarioVO.pass != null && usuarioVO.pass.Length > 0)
                            usuarioVO.pass = DecryptPassword(usuarioVO.pass,"cajuborboletaorangotango");
                }
                
                return listUsuario;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (reader != null && !reader.IsClosed)
                    reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
        }

		public static void setUsuario(UsuarioVO usuarioVO)
		{
            if (usuarioVO.pass != null && usuarioVO.pass.Length > 0)
            {
                usuarioVO.pass = EncryptPassword(usuarioVO.pass, "cajuborboletaorangotango");
            }
            
            StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE usuario ");
			query.AppendLine("SET nome=@nome, email=@email, user=@user, pass=@pass, ativo=@ativo, fone1=@fone1, fone2=@fone2, fone3=@fone3,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idUsuario=@idUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idUsuario", usuarioVO.idUsuario));
			cmd.Parameters.Add(getParameter(cmd, "@nome", usuarioVO.nome));
			if (usuarioVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", usuarioVO.email));
			cmd.Parameters.Add(getParameter(cmd, "@user", usuarioVO.user));
			if (usuarioVO.pass == null)
				cmd.Parameters.Add(getParameter(cmd, "@pass", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@pass", usuarioVO.pass));
			cmd.Parameters.Add(getParameter(cmd, "@ativo", (usuarioVO.ativo==null?" ":(usuarioVO.ativo.Value?"S":"N"))));
			if (usuarioVO.fone1 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone1", usuarioVO.fone1));
			if (usuarioVO.fone2 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone2", usuarioVO.fone2));
			if (usuarioVO.fone3 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone3", usuarioVO.fone3));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", usuarioVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", usuarioVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", usuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", usuarioVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static long newUsuario(UsuarioVO usuarioVO)
		{
            if (usuarioVO.pass != null && usuarioVO.pass.Length > 0)
            {
                usuarioVO.pass = EncryptPassword(usuarioVO.pass, "cajuborboletaorangotango");
            }

            StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO usuario ");
			query.AppendLine("  ( nome, email, user, pass, ativo, fone1, fone2, fone3, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @nome, @email, @user, @pass, @ativo, @fone1, @fone2, @fone3, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@nome", usuarioVO.nome));
			if (usuarioVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", usuarioVO.email));
			cmd.Parameters.Add(getParameter(cmd, "@user", usuarioVO.user));
			if (usuarioVO.pass == null)
				cmd.Parameters.Add(getParameter(cmd, "@pass", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@pass", usuarioVO.pass));
			cmd.Parameters.Add(getParameter(cmd, "@ativo", (usuarioVO.ativo==null?" ":(usuarioVO.ativo.Value?"S":"N"))));
			if (usuarioVO.fone1 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone1", usuarioVO.fone1));
			if (usuarioVO.fone2 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone2", usuarioVO.fone2));
			if (usuarioVO.fone3 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone3", usuarioVO.fone3));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", usuarioVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", usuarioVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", usuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", usuarioVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('usuario') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static void delUsuario(UsuarioVO usuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM usuario ");
			query.AppendLine("WHERE idUsuario=@idUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idUsuario", usuarioVO.idUsuario));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}
	}
}
